#include <stdio.h>
#include <stdlib.h>

// 数据元素
typedef struct {
    int no; // 学号
    char name[20]; // 姓名
    int score; // 成绩
} ElemType;

// 数据结构--顺序表
typedef struct {
    int MaxSize; // 最大个数
    ElemType *data; // 动态数组
    int length; // 长度
} SeqList;



// 初始化顺序表
void InitSeqList(SeqList *L, int MaxSize) {
    L->MaxSize = MaxSize;
    L->data = (ElemType *)malloc(MaxSize * sizeof(ElemType));
    L->length = 0;
}

// 销毁顺序表
void DestroySeqList(SeqList *L) {
    free(L->data);
}

// 顺序表是否为空
int IsEmpty(SeqList L) {
    return L.length == 0;
}

// 顺序表是否已满
int IsFull(SeqList L) {
    return L.length == L.MaxSize;
}

// 顺序表长度
int Length(SeqList L) {
    return L.length;
}

// 顺序表元素
ElemType GetElem(SeqList L, int i) {
    return L.data[i];
}

// 插入元素
void Insert(SeqList *L, ElemType e) {
    if (IsFull(*L)) {
        printf("顺序表已满！\n");
        return;
    }
    L->data[L->length] = e;
    L->length++;
}

// 删除元素
void Delete(SeqList *L, int i) {
    if (IsEmpty(*L)) {
        printf("顺序表为空！\n");
        return;
    }
    for (int j = i; j < L->length - 1; j++) {
        L->data[j] = L->data[j + 1];
    }
    L->length--;
}

// 输出顺序表
void PrintSeqList(SeqList L) {
    printf("==========当前顺序表如下=============================\n\n");
    for (int i = 0; i < L.length; i++) {
        printf("%d %s %d\n", L.data[i].no, L.data[i].name, L.data[i].score);
    }
    printf("===================================================\n\n");
}

// 扩容顺序表
void ExtendSeqList(SeqList *L, int newMaxSize) {
    ElemType *p = L->data;
    L->data = (ElemType *)malloc(newMaxSize * sizeof(ElemType));
    for (int i = 0; i < L->length; i++) {
        L->data[i] = p[i];
    }
    L->MaxSize = newMaxSize;
    free(p);
    printf("顺序表扩大成功！\n");
}   

// 内容查找
int Locate(SeqList L, ElemType e) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i].no == e.no) {
            return i;
        }
    }
    return -1;
}


// 顺序表测试
int main() {
    SeqList L;
    InitSeqList(&L, 10);

    ElemType e1 = {1001, "张三", 90};
    ElemType e2 = {1002, "李四", 85};
    ElemType e3 = {1003, "王五", 95};
    ElemType e4 = {1004, "赵六", 80};

    Insert(&L, e1);
    Insert(&L, e2);
    Insert(&L, e3);
    Insert(&L, e4);

    PrintSeqList(L);

    Delete(&L, 2);

    PrintSeqList(L);

    DestroySeqList(&L);

    return 0;
}